Socket.IO Spring服务器,与浏览器连接,仅与Node.js连接

您所在的位置:网站首页 websocket client for edge Socket.IO Spring服务器,与浏览器连接,仅与Node.js连接

Socket.IO Spring服务器,与浏览器连接,仅与Node.js连接

2023-04-27 17:50| 来源: 网络整理| 查看: 265

嘿,我有下面的,它上面有一个SocketIoServer端点,在用Node.js环境编写的客户机中测试时,服务器运行得很好,但是在浏览器(Chrome和Edge,没有测试不同的浏览器)上没有来自服务器的响应。

我使用的是以下Socket.IO-Server库:https://github.com/trinopoty/socket.io-server-java,并遵循了连接到的指南,在这里可以找到:https://github.com/socketio/engine.io-server-java/blob/master/docs/spring-integration.rst

ServerApplication.java

@SpringBootApplication public class ServerApplication { @Bean public EngineIoServer engineIoServer(){ EngineIoServerOptions options = EngineIoServerOptions.newFromDefault(); options.setAllowedCorsOrigins(new String[]{"*"}); options.setPingTimeout(30000); EngineIoServer engineIoServer = new EngineIoServer(options); SocketIoServer socketIoServer = new SocketIoServer(engineIoServer); socketIoServer.namespace("/game").on("connection", args -> { System.out.println("Connected"); }); return engineIoServer; } public static void main(String[] args) { SpringApplication.run(ServerApplication.class,args); } }

EngineIoConfigurator.java

@Configuration @EnableWebSocket public class EngineIoConfigurator implements WebSocketConfigurer { private final EngineIoHandler mEngineIoHandler; public EngineIoConfigurator(EngineIoHandler engineIoHandler){ mEngineIoHandler = engineIoHandler; } @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry){ registry.addHandler(mEngineIoHandler,"/socket.io/").addInterceptors(mEngineIoHandler); registry.addHandler(mEngineIoHandler,"/engine.io/").addInterceptors(mEngineIoHandler); } }

EngineIoHandler.java

@Controller public class EngineIoHandler implements HandshakeInterceptor, WebSocketHandler { private static final String ATTRIBUTE_ENGINEIO_BRIDGE = "engineIo.bridge"; private static final String ATTRIBUTE_ENGINEIO_QUERY = "engineIo.query"; private final EngineIoServer mEngineIoServer; public EngineIoHandler(EngineIoServer engineIoServer) { mEngineIoServer = engineIoServer; } @RequestMapping( value = "/engine.io/*", method = {RequestMethod.GET, RequestMethod.POST, RequestMethod.OPTIONS}, headers = "Connection!=Upgrade") public void httpHandler(HttpServletRequest request, HttpServletResponse response) throws IOException { mEngineIoServer.handleRequest(request,response); } @RequestMapping( value = "/socket.io/*", method = {RequestMethod.GET, RequestMethod.POST, RequestMethod.OPTIONS}, headers = "Connection!=Upgrade") public void httpHandler2(HttpServletRequest request, HttpServletResponse response) throws IOException { mEngineIoServer.handleRequest(request,response); } /* HandshakeInterceptor */ @Override public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map attributes) throws IOException { attributes.put(ATTRIBUTE_ENGINEIO_QUERY,request.getURI().getQuery()); return true; } @Override public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception exception) { } /* WebSocketHandler */ @Override public boolean supportsPartialMessages() { return false; } @Override public void afterConnectionEstablished(WebSocketSession webSocketSession) { final EngineIoSpringWebSocket websocket = new EngineIoSpringWebSocket(webSocketSession); webSocketSession.getAttributes().put(ATTRIBUTE_ENGINEIO_BRIDGE, websocket); mEngineIoServer.handleWebSocket(websocket); } @Override public void afterConnectionClosed(WebSocketSession webSocketSession, CloseStatus closeStatus) { ((EngineIoSpringWebSocket)webSocketSession.getAttributes().get(ATTRIBUTE_ENGINEIO_BRIDGE)) .afterConnectionClosed(closeStatus); } @Override public void handleMessage(WebSocketSession webSocketSession, WebSocketMessage webSocketMessage) { ((EngineIoSpringWebSocket)webSocketSession.getAttributes().get(ATTRIBUTE_ENGINEIO_BRIDGE)) .handleMessage(webSocketMessage); } @Override public void handleTransportError(WebSocketSession webSocketSession, Throwable throwable) { ((EngineIoSpringWebSocket)webSocketSession.getAttributes().get(ATTRIBUTE_ENGINEIO_BRIDGE)) .handleTransportError(throwable); } private static final class EngineIoSpringWebSocket extends EngineIoWebSocket { private final WebSocketSession mSession; private final Map mQuery; EngineIoSpringWebSocket(WebSocketSession session) { mSession = session; final String queryString = (String)mSession.getAttributes().get(ATTRIBUTE_ENGINEIO_QUERY); if (queryString != null) { mQuery = ParseQS.decode(queryString); } else { mQuery = new HashMap(); } } /* EngineIoWebSocket */ @Override public Map getQuery() { return mQuery; } @Override public Map getConnectionHeaders() { return null; } @Override public void write(String message) throws IOException { mSession.sendMessage(new TextMessage(message)); } @Override public void write(byte[] message) throws IOException { mSession.sendMessage(new BinaryMessage(message)); } @Override public void close() { try { mSession.close(); } catch (IOException ignore) { } } /* WebSocketHandler */ void afterConnectionClosed(CloseStatus closeStatus) { emit("close"); } void handleMessage(WebSocketMessage message) { if (message.getPayload() instanceof String || message.getPayload() instanceof byte[]) { emit("message", (Object) message.getPayload()); } else { throw new RuntimeException(String.format( "Invalid message type received: %s. Expected String or byte[].", message.getPayload().getClass().getName())); } } void handleTransportError(Throwable exception) { emit("error", "write error", exception.getMessage()); } } }

下面是用Node.js编写的客户端代码,它是作为管理员工作的。

main.js

const io = require('socket.io-client'); socket = io.connect('http://localhost:4919/game', { transports: ['websocket'], reconnection: false }); socket.on('connect', () => { console.log('Connected'); });

但浏览器应用程序具有相同的代码,但无法工作。

index.html

const socket = io('http://localhost:4919/game', { transports: ['websocket'], reconnection: false }); socket.on('connect', function() { console.log('connected'); });

浏览器会出现以下错误

WebSocket connection to 'ws://localhost:4919/socket.io/?EIO=4&transport=websocket' failed:

在网络面板中,我可以看到没有建立任何连接。

为了测试目的,我安装了一个node.js socket.io服务器,以确保浏览器成功地连接了服务器,我得到了以下响应。

任何帮助都将不胜感激。

编辑:我发现通过将传输更改为轮询使连接稳定,但如果可能的话,我仍然希望它是websocket。

const socket = io('http://localhost:4919/game', { transports: ['polling'], reconnection: false }); socket.on('connect', function() { console.log('connected'); });

得出以下结果。

我仍然没有找到使用websocket传输的方法。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3